home *** CD-ROM | disk | FTP | other *** search
/ Freelog 4 / FREELOG 4.iso / Prog / Delphi / Etape2 / Unit1.pas < prev   
Pascal/Delphi Source File  |  1999-07-19  |  8KB  |  328 lines

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   DXClass, DXDraws, DXSprite, DXInput;
  8.  
  9. type
  10.   TForm1 = class(TDXForm)
  11.     DXDraw1: TDXDraw;
  12.     DXImageList1: TDXImageList;
  13.     DXTimer1: TDXTimer;
  14.     DXSpriteEngine1: TDXSpriteEngine;
  15.     DXInput1: TDXInput;
  16.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  17.       Shift: TShiftState);
  18.     procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
  19.     procedure FormCreate(Sender: TObject);
  20.   private
  21.     { DΘclarations privΘes }
  22.   public
  23.     { DΘclarations publiques }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30. {$R *.DFM}
  31.  
  32. // ***************************
  33. // La structure pour les mΘchants
  34. // ***************************
  35. type
  36.   TMechantSprite = class( TImageSprite)
  37.     private
  38.       // Le sens de dΘplacement (droite ou gauche ?)
  39.       FSens : Integer;
  40.     protected
  41.       // Pour les dΘplacements
  42.       procedure DoMove( MoveCount : Integer);override;
  43.     public
  44.       // Pour la crΘation
  45.       constructor Create( AParent : TSprite);override;
  46.   end;
  47.  
  48. // Le tableau des mΘchants
  49. var Mechants : Array[1..50] of TMechantSprite;
  50. var nNbEnnemis : Integer;
  51. // ***************************
  52. // La structure pour le joueur
  53. // ***************************
  54. type
  55.   TPlayerSprite = class( TImageSprite)
  56.     private
  57.       // Le nombre de tirs
  58.       FNumberShoot : Integer;
  59.       // Les dΘlais pour les tirs
  60.       FCounter : Integer;
  61.       FOldShootCounter : Integer;
  62.     protected
  63.       // La procΘdure appellΘe pour les dΘplacements du joueurs
  64.       procedure DoMove( MoveCount : Integer);override;
  65.       procedure DoCollision( Sprite : TSprite; var Done : Boolean); override;
  66.     public
  67.       // La procΘdure apellΘe pour crΘer le joueur
  68.       constructor Create( AParent : TSprite);override;
  69.   end;
  70.  
  71. // La variable du joueur
  72. var Player : TPlayerSprite;
  73.  
  74.  
  75. // ***************************
  76. // La structure du tir du joueur
  77. // ***************************
  78. type
  79.   TShootSprite = class( TImageSprite)
  80.     private
  81.       // Quel est le joueur qui tire ?
  82.       FPlayer : TPlayerSprite;
  83.     protected
  84.       // Les dΘplacements et la gestion des collisions
  85.       procedure DoMove( MoveCount : Integer) ; override;
  86.       procedure DoCollision( Sprite : TSprite; var Done : Boolean); override;
  87.     public
  88.       // CrΘation et destruction des missiles
  89.       constructor Create( AParent : TSprite); override;
  90.       destructor Destroy;override;
  91.   end;
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98. // Initalisation des ennemis
  99. constructor TMechantSprite.Create( AParent : TSprite);
  100. begin
  101.   inherited Create( AParent);
  102.   // Affecte le dessin correspondant
  103.   Image := Form1.DXImageList1.Items.Find( 'vaisseau');
  104.   // La profondeur de cet objet (pour les transparences)
  105.   Z := 2;
  106.   Width := Image.Width;
  107.   Height := Image.Height;
  108.   // Sens de dΘplacement
  109.   FSens := 1;
  110. end;
  111. procedure TMechantSprite.DoMove( MoveCount : Integer);
  112. begin
  113.   inherited DoMove( MoveCount);
  114.   // DΘplacement
  115.   X := X + Int((MoveCount * (300/1000))) * FSens;
  116.   // Si l'un des bords est atteind, on change le sens de dΘplacement
  117.   if (X > (Form1.DXDraw1.Width - Width)) Or ( X< 0) then
  118.   begin
  119.     FSens := - FSens;
  120.     Y := Y + 5;
  121.   end
  122. end;
  123.  
  124.  
  125.  
  126. // ***************************
  127. // Les procΘdures et fonctions du joueur
  128. // ***************************
  129. constructor TPlayerSprite.Create( AParent : TSprite);
  130. begin
  131.   inherited Create( AParent);
  132.   Image := Form1.DXImageList1.Items.Find( 'joueur');
  133.   Z := 2;
  134.   Width := Image.Width;
  135.   Height := Image.Height;
  136.   FNumberShoot := 0;
  137.   X := (Form1.DXDraw1.Width- Width) div 2;
  138.   Y := Form1.DXDraw1.Height- Height;
  139. end;
  140. procedure TPlayerSprite.DoMove( MoveCount : Integer);
  141. begin
  142.   inherited DoMove( MoveCount);
  143.   // Teste l'Θtat des entrΘes (clavier et joystick) et bouge en consΘquence
  144.   // Est-ce que le joueur va α droite ?
  145.   if isRight in Form1.DXInput1.States then
  146.   begin
  147.     X := X + (300/1000) * MoveCount;
  148.   end;
  149.   // Est-ce que le joueur va α gauche ?
  150.   if isLeft in Form1.DXInput1.States then
  151.   begin
  152.     X := X - (300/1000) * MoveCount;
  153.   end;
  154.   // Est-ce que le joueur monte ?
  155.   if isUp in Form1.DXInput1.States then
  156.   begin
  157.     Y := Y - (300/1000) * MoveCount;
  158.   end;
  159.   // Le joueur descend
  160.   if isDown in Form1.DXInput1.States then
  161.   begin
  162.     Y := Y + (300/1000) * MoveCount;
  163.   end;
  164.   // Le joueur appuie sur le bouton 1
  165.   if isButton1 in Form1.DXInput1.States then
  166.   begin
  167.     // On a tirΘ moins de 3 missiles et l'espace entre deux missiles et suffisant
  168.     if (FNumberShoot < 3) And ( (FCounter-FOldShootCounter) >=100)then
  169.     begin
  170.       Inc( FNumberShoot);
  171.       TShootSprite.Create( Engine);
  172.       FOldShootCounter := FCounter;
  173.     end;
  174.   end;
  175.   // Mise α jour du compteur pour les tirs
  176.   FCounter := FCounter + MoveCount;
  177.  
  178.   // Borne les dΘplacements du joueur
  179.   if X < 0 then
  180.     X := 0;
  181.   if X > (Engine.Width-Width) then
  182.     X := (Engine.Width-Width);
  183.   if Y < 0 then
  184.     Y := 0;
  185.   if Y > (Engine.Height - Height) then
  186.     Y := (Engine.Height -Height );
  187.  
  188.   // Teste les collisions
  189.   Collision;
  190. end;
  191.  
  192. procedure TPlayerSprite.DoCollision( Sprite : TSprite; var Done : Boolean);
  193. begin
  194.   if Sprite is TMechantSprite then
  195.   begin
  196.     Dead;
  197.     Form1.Close;
  198.   end;
  199.   Done := False;
  200. end;
  201.   
  202.  
  203.  
  204.  
  205.  
  206. // **********************************************
  207. // Les procΘdures et fonctions des tirs du joueur
  208. // **********************************************
  209. constructor TShootSprite.Create( AParent : TSprite);
  210. begin
  211.   inherited Create( AParent);
  212.   // Affecte ce tir au joueur
  213.   FPlayer := Player;
  214.   Image := Form1.DXImageList1.Items.Find( 'laser');
  215.   Z := 2;
  216.   Width := Image.Width;
  217.   Height := Image.Height;
  218.   // Positionne le missile au centre du vaisseau
  219.   X := FPlayer.X+FPlayer.Width div 2 -3;
  220.   Y := FPlayer.Y+Height;
  221. end;
  222. destructor TShootSprite.Destroy;
  223. begin
  224.   // On "tue" le missile => dΘcrΘmente le nombre de tir
  225.   Dec( FPlayer.FNumberShoot);
  226.   inherited Destroy;
  227. end;
  228. procedure TShootSprite.DoMove( MoveCount : Integer);
  229. begin
  230.   inherited DoMove( MoveCount);
  231.  
  232.   Y := Y - (800/1000)*MoveCount;
  233.   // Teste les collisions du missile
  234.   Collision;
  235.   
  236.   // On sort de l'Θcran => "tue" le sprite
  237.   if Y <= 0 then
  238.     Dead;
  239. end;
  240. procedure TShootSprite.DoCollision( Sprite : TSprite; var Done : Boolean);
  241. begin
  242.   // Si le missile touche un mechant => Il meurt et c'est bien fait !
  243.   if Sprite is TMechantSprite then
  244.   begin
  245.     Dec (nNbEnnemis);
  246.     // Tue le mΘchant
  247.     Sprite.Dead;
  248.     // "Tue" le missile
  249.     Dead;
  250.   end;
  251.   Done := False;
  252. end;
  253.  
  254.  
  255.  
  256.  
  257. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  258.   Shift: TShiftState);
  259. begin
  260.   if Key = VK_ESCAPE then
  261.     Close;
  262.   if ( ssAlt in Shift) And( Key = VK_RETURN) then
  263.   begin
  264.     DXDraw1.Finalize;
  265.     if doFullScreen in DXDraw1.Options then
  266.     begin
  267.       RestoreWindow;
  268.       DXDraw1.Cursor := crDefault;
  269.       BorderStyle := bsSizeable;
  270.       DXDraw1.Options := DXDraw1.Options-[doFullScreen];
  271.     end
  272.     else
  273.     begin
  274.       StoreWindow;
  275.       DXDraw1.Cursor := crNone;
  276.       BorderStyle := bsNone;
  277.       DXDraw1.Options := DXDraw1.Options+[doFullScreen];
  278.     end;
  279.     DXDraw1.Initialize;
  280.   end;
  281. end;
  282.  
  283. procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
  284. begin
  285.   if Not DXDraw1.CanDraw then Exit;
  286.  
  287.   // Actualisation des entrΘes de l'utilisateur
  288.   DXInput1.Update;
  289.  
  290.   // Fais bouger tout le petit monde ( 60 images par secondes)!
  291.   DXSpriteEngine1.Move( 1000 div 60);
  292.   DXSpriteEngine1.Dead;
  293.   // Efface l'Θcran
  294.   DXDraw1.Surface.Fill(0);
  295.   // Affiche les sprites
  296.   DXSpriteEngine1.Draw;
  297.   // Rend visible l'Θcran
  298.   DXDraw1.Flip;
  299.   // Il n'y a plus d'ennemis
  300.   if nNbEnnemis <= 0 then
  301.     Close;
  302. end;
  303.  
  304. procedure TForm1.FormCreate(Sender: TObject);
  305. var i, j, k : Integer;
  306. begin
  307.   // CrΘation des mΘchants
  308.   k := 0;
  309.   for j := 1 to 5 do
  310.   begin
  311.     for i := 1 to 10 do
  312.     begin
  313.       Mechants[k] := TMechantSprite.Create( DXSpriteEngine1.Engine);
  314.       With Mechants[k] do
  315.       begin
  316.         X := i*Mechants[k].Width;
  317.         Y := j*Mechants[k].Height;
  318.       end;
  319.       k := k + 1;
  320.     end;
  321.   end;
  322.   // Initialisation du nombre maxi d'ennemis
  323.   nNbEnnemis := 50;
  324.   // CrΘation du joueur
  325.   Player := TPlayerSprite.Create( DXSpriteEngine1.Engine);
  326. end;
  327. end.
  328.